Effective C++ --让自己习惯C++(02)

一,Use const whenever possible.(03)

主要内容

const是一个强大的武器,它允许你指定一个语义约束(指定一个“不该被改动”的对象),然后通过编译器来行使这项约束。而我们应该做的事情就是,只要这(某值应该保持不变)是一个事实,那么久该尽可能的说出来,获得编译器的襄助,减少程序出错的可能。

下面记录一些我觉得自己还不太熟的tips:
1,const在*左右分别表示 是指针指向的数值为const还是指针本身是const。

1
2
3
4
5
char greeting[] = "Hello"
char* p = greeting; //not-const pointer, non-const data
const char* p = greeting; //non-const pointer, const data
char* const p = greeting; //const pointer, non-const data
const char* const p = greeting; // const pointer, const data

2,const在函数前,表示其返回值是const不能被修改;const如果为函数参数,表示该参数在函数中不可被修改;const如果修饰函数本身,则这个函数是bitwise const的,不可修改任何关于对象的内容。

3,const 和 const-non函数,可以够成重载。但是这往往会导致大量代码的重复。我们可以通过让non-const函数调用const函数实现常量性转移(casting away constness)(不可反向)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//for example
class TextBlock{
public:
TextBlock(string s)
{
text = s;
}
char& operator [](size_t t)
{
return const_cast<char&> (
static_cast<const TextBlock&>(*this)[t]
);
}
const char& operator [](size_t t) const
{
return text[t];
}
private:
string text;
//即使在const函数中,也加油被修改
mutable bool flag;
};